package com.fairytask.ui.mainUnit
{
	import com.fairytask.data.ObjectData;
	import com.fairytask.data.ViewObject;
	import com.fairytask.define.ViewDefine;
	import com.fairytask.engine.components.button.Button;
	import com.fairytask.engine.components.clip.Clip;
	import com.fairytask.engine.components.text.Input;
	import com.fairytask.engine.define.Filter;
	import com.fairytask.engine.define.ResConfig;
	import com.fairytask.managers.ResManager;
	import com.fairytask.ui.base.UnitUI;
	import com.fairytask.ui.pack.PackageUI;
	
	import flash.display.MovieClip;
	import flash.events.MouseEvent;
	import flash.geom.Point;
	
	/**
	 * 角色及宠物列表 
	 * @author xujh
	 * 
	 */
	public class RoleListUI extends UnitUI
	{
		private static var _self		:RoleListUI;
		
//		public var photoVG		:ViewGroup;		//头像容器
		
		private const MAXNUM	:int = 6;	//单页显示的头像数量
		
		public var lastBtn		:Button;		//上一页
		public var nextBtn		:Button;		//下一页
		public var pageLab		:Input;			//页数
		//头像显示列表
		private var _roleList	:Array = [];
		//宠物数据列表
		private var _petsData	:Array = [];
		
		private var _profileUI	:ProfileUI	= ProfileUI.getInstance();
		private var _packageUI	:PackageUI	= PackageUI.getInstance();
		
		private var _curSelect	:int	= -1;	//当前对象位置
		private var _curObj	:Point;		//当前选择对象objid
		//分页显示数据
		private var _curPage	:int = 1;	//当前页
		private var _maxPage	:int = 1;
		private var _petCount	:int = 1;	//宠物数量，用于计算宠物总数
		//用于解绑
		private var _unbind	:Array	=	[];
		
		public static function getInstance():RoleListUI
		{
			if (_self == null)
			{
				_self=new RoleListUI;
			}
			return _self;
		}
		
		public function RoleListUI()
		{
			super();
			initList();
			initBind();
			initEvent();
		}
		
		/**
		 * 初始化头像列表 
		 * 
		 */
		private function initList():void
		{
			for(var i:int=0;i<MAXNUM;i++)
			{
				var mc:MovieClip = new MovieClip();
				mc.pos = i;
				mc.mouseChildren = false;
				//间隔，位置
				mc.x = 14;
				mc.y = 20 + i * 74;
				mc.addEventListener(MouseEvent.CLICK,onClick);
				//给mc添加背景
				var bg:MovieClip = ResManager.newResClass("CustSkin_015") as MovieClip;
				bg.width = 65;
				bg.height = 65;
				mc.addChild(bg);
				//背景默认不显示
				bg.visible = false;
				windowBG.addChild(mc);
				_roleList.push(mc);
			}
			//列表第一个位置是人物的
			setPlayer();
		}
		
		/**
		 * 初始化设置人物属性
		 * 
		 */
		private function setPlayer():void
		{
			//把人物加入位置
			//addVGByIndex(_player.data,0);
			//默认属性数据
			//onSelect(0);
		}
		
		/**
		 * 单击 
		 * @param evt
		 * 
		 */
		private function onClick(evt:MouseEvent):void
		{
			//不为空
			if(evt.currentTarget.data)
			{
				//选中当前对象
				onSelect(evt.currentTarget.pos);
			}
		}
		
		/**
		 * 选中对象 
		 * 
		 */
		private function onSelect(pos:int):void
		{
			if(_curSelect == pos)
			{
				return;
			}
			if(_curSelect!=-1)
			{
				//先清除原先选中的滤镜
				_roleList[_curSelect].filters	=	null;
			}
			var _curMc	:MovieClip = _roleList[pos] as MovieClip;
			if(null == _curMc.data)
			{
				return;
			}
			_curSelect = pos;
			//添加滤镜
			_curMc.filters	=	[Filter.YELLOW_INNER];
			//更新属性面板数据
			_profileUI.data = _curMc.data;
			//是人物
			_curObj = _curMc.data.objId;
		}
		
		/**
		 * 初始化绑定 
		 * 
		 */
		private function initBind():void
		{
			//bindManager.BindView(model.scene,ViewDefine.VIEWPORT_PET,onAddPet,onRemovePet);
		}
		
		/**
		 * 初始化事件 
		 * 
		 */
		private function initEvent():void
		{
			lastBtn.addEventListener(MouseEvent.CLICK,onPageBack);
			nextBtn.addEventListener(MouseEvent.CLICK,onPageNext);
		}
		
		/**
		 * 上一页 
		 * @param evt
		 * 
		 */
		private function onPageBack(evt:MouseEvent):void
		{
			onPage(_curPage-1);
		}
		
		/**
		 * 下一页 
		 * @param evt
		 * 
		 */
		private function onPageNext(evt:MouseEvent):void
		{
			onPage(_curPage+1);
		}
		
		/**
		 * 显示第几页内容 
		 * @param page
		 * 
		 */
		private function onPage(page:int):void
		{
			_curPage = page;
			//先清除当前容器内容
			clearList();
			pageLab.htmlStr = _curPage + "/" + _maxPage;
			//显示内容
			showPage();
			//按钮控制
			_curPage == 1 ? lastBtn.enabled = false : lastBtn.enabled = true;
			_curPage == _maxPage ? nextBtn.enabled = false : nextBtn.enabled = true;
		}
		
		/**
		 * 显示页面头像
		 * @param page 页数
		 * 
		 */
		private function showPage():void
		{
			var num		:int = getLockedPets(_petCount);
			var index	:int;
			for(var i:int=0;i<MAXNUM;i++)
			{
				//第一页第一个是人物
				if(_curPage == 1 && i == 0)
				{
					//addVGByIndex(_player.data,0);
				}
				else
				{
					index = getPetPos(i);
					if(i < num)
					{
						addPhoto(index,_petsData[index]);
					}
				}
			}
			//默认选中第一个
			onSelect(0);
		}
		
		/**
		 * 添加宠物 
		 * @param key
		 * @param val
		 * @param data
		 * 
		 */
		private function onAddPet(key:String, val:ViewObject, data:Object):void
		{
			if(val.GetPropertiesEx("Model")=="")
			{
				return;
			}
			_petCount++;
			//_unbind.push([val,"PetPos",bindManager.BindPropInViewObj(model.scene.GetView(ViewDefine.VIEWPORT_PET),key,"PetPos",onChangePos,null,[val])]);
			changeMaxPage();
		}
		
		/**
		 * 移除宠物 
		 * @param key
		 * @param val
		 * @param data
		 * 
		 */
		private function onRemovePet(key:String, val:ViewObject, data:Object):void
		{
			var pos	:int	=	_petsData.indexOf(val,0);
			if(pos > 0)
			{
				_petsData[pos]	= [];
				delPhoto(pos);
			}
			_petCount--;
			var i	:int;
			for each(var itemBind:Array in _unbind)
			{
				if(itemBind[0] == val)
				{
					bindManager.UnbindProp(itemBind.shift(),itemBind.shift(),itemBind.shift());
					_unbind.splice(i,1);
					break;
				}
				i++;
			}
			changeMaxPage();
		}
		
		/**
		 * 更改位置的时候 
		 * @param key
		 * @param val
		 * @param arr
		 * 
		 */
		private function onChangePos(key:String,val:int,arr:Array):void
		{
			var id	:int = _petsData.indexOf(arr[0],0);
			//找到了原先数据
			if(id != -1)
			{
				_petsData[id] = [];
				//旧的位置是否在当前
				delPhoto(id);
			}
			_petsData[val] = arr[0];
			//新的位置在当前
			addPhoto(val,arr[0]);
		}
		
		/**
		 * 显示位置的头像
		 * @param pos
		 * 
		 */
		private function addPhoto(pos:int,val:ViewObject):void
		{
			//第一个位置是人物
			if(pos == 0 || val == null)
			{
				return;
			}
			if(isInCur(pos))
			{
				var index	:int	=	getCurPos(pos);
				//显示位置头像
				addVGByIndex(val,index);
			}
		}
		
		 /**
		 * 删除位置的头像 
		 * @param pos
		 * 
		 */
		private function delPhoto(pos:int):void
		{
			//第一个位置是人物
			if(pos == 0)
			{
				return;
			}
			if(isInCur(pos))
			{
				var index	:int	=	getCurPos(pos);
				delVGByIndex(index);
				if(index == _curSelect)
				{
					onSelect(0);
				}
			}
		}
		
		/**
		 * 添加头像图片及数据 
		 * @param val
		 * @param pos
		 * 
		 */
		private function addVGByIndex(val:ObjectData,pos:int):void
		{
			//视图位置>数据错误
			if(pos >= 6)
			{
				return;
			}
			delVGByIndex(pos);
			if(_roleList[pos].clip==null)
			{
				var photo	:Clip = new Clip();
				photo.source = ResConfig.pngPhotoPath + val.GetPropertiesEx("Model") + ResConfig.photoImg;
				photo.x = 6;
				photo.y = 7;
				photo.width = 50;
				photo.height = 50;
				_roleList[pos].addChild(photo);
				_roleList[pos].data = val;
				_roleList[pos].clip	= photo;
				_roleList[pos].buttonMode = true;
				//背景显示
				_roleList[pos].getChildAt(0).visible = true;
			}
		}
		
		/**
		 * 删除对应位置数据 
		 * @param val
		 * @param pos
		 * 
		 */
		private function delVGByIndex(pos:int):void
		{
			if(_roleList[pos].clip!=null)
			{
				(_roleList[pos] as MovieClip).removeChild(_roleList[pos].clip);
				_roleList[pos].data = null;
				_roleList[pos].clip = null;
				_roleList[pos].buttonMode = false;
				//背景显示
				_roleList[pos].getChildAt(0).visible = false;
			}
		}
		
		/**
		 * 重新计算最大页面数量 
		 * 
		 */
		private function changeMaxPage():void
		{
			//重新计算最大页面
			_maxPage = Math.ceil(_petCount / MAXNUM);
			if(_maxPage > 1)
			{
				lastBtn.visible = true;
				nextBtn.visible = true;
				pageLab.visible = true;
				//页数x/xx
				pageLab.htmlStr = _curPage + "/" + _maxPage;
				//按钮控制
				_curPage == 1 ? lastBtn.enabled = false : lastBtn.enabled = true;
				_curPage == _maxPage ? nextBtn.enabled = false : nextBtn.enabled = true;
			}
			else
			{
				lastBtn.visible = false;
				nextBtn.visible = false;
				pageLab.visible = false;
			}
		}
		
		/**
		 * 返回当前页数量
		 * @param pos
		 * @return 
		 * 
		 */
		private function getLockedPets(val:int):int
		{
			var num	:int;
			//超过本页数量
			if(val >= _curPage * MAXNUM)
			{
				num = MAXNUM;
			}
			//不到当前页面
			else if(val <= (_curPage - 1) * MAXNUM)
			{
				num = 0;
			}
			//当前数量
			else
			{
				num = val % MAXNUM;
			}
			return num;
		}
		
		/**
		 * 返回视图位置 
		 * @param pos 数据位置
		 * @return 
		 * 
		 */
		private function getCurPos(pos:int):int
		{
			return pos%MAXNUM;
		}
		
		/**
		 * 返回数据列表位置 
		 * @param pos 视图位置
		 * @return 
		 * 
		 */
		private function getPetPos(pos:int):int
		{
			return (_curPage-1)*MAXNUM + pos;
		}
		
		/**
		 * 位置是否在当前页显示 
		 * @param pos
		 * @return 
		 * 
		 */
		private function isInCur(pos:int):Boolean
		{
			if(Math.floor(pos/ MAXNUM) == _curPage - 1)
			{
				return true;
			}
			else
			{
				return false;
			}
		}
		
		/**
		 * 清除头像列表，准备刷新 
		 * 
		 */
		private function clearList():void
		{
			for(var i:int=0;i<MAXNUM;i++)
			{
				delVGByIndex(i);
			}
			//清除选中
			if(_curSelect!=-1)
			{
				//先清除原先选中的滤镜
				_roleList[_curSelect].filters	=	null;
			}
			_curSelect = -1;
			_curObj = null;
		}
		
		/**
		 * 获取当前选择对象ID
		 * 
		 */
		public function get curObj():Point
		{
			return _curObj;
		}
		
		/**
		 * 重置，默认人
		 * 
		 */
		override public function reset():void
		{
			//重置显示第一页
			//先清除当前容器内容
			onPage(1);
			
			//取消选择
			/*if(_curSelect!=-1)
			{
				//先清除原先选中的滤镜
				_roleList[_curSelect].filters	=	null;
			}
			_curSelect = -1*/
			onSelect(0);
		}
	}
}